//验证规则 ,可以写到一个文件也可以分开写如schema-user.js、artcate.js、……
const joi = require('joi')

/**
 * string() 值必须是字符串
 * alphanum() 值只能是包含 a-zA-Z0-9 的字符串
 * min(length) 最小长度
 * max(length) 最大长度
 * required() 值是必填项，不能为 undefined
 * pattern(正则表达式) 值必须符合正则表达式的规则
 */

// 1. 用户名的验证规则
const username = joi.string().alphanum().min(1).max(10).required()
// 密码的验证规则6-12之间
const password = joi
  .string()
  .pattern(/^[\S]{6,12}$/)
  .required()
// 注册和登录表单的验证规则对象
exports.reg_login_schema = {
  // 表示需要对 req.body 中的数据进行验证
  body: {
    username,
    password,
  },
}


// 2. 定义 id, nickname, emial 的验证规则
const id = joi.number().integer().min(1).required()
const nickname = joi.string().required()
const email = joi.string().email().required()
// 验证规则对象 - 更新用户基本信息
exports.update_userinfo_schema = {
  body: {
    id,
    nickname,
    email,
  },
}

// 二 个人中心 1. 验证规则对象 - 重置密码
exports.update_password_schema = {
  body: {
    // 使用 password 这个规则，验证 req.body.oldPwd 的值
    oldPwd: password,
    // 使用 joi.not(joi.ref('oldPwd')).concat(password) 规则，验证 req.body.newPwd 的值
    // 解读：
    // 1. joi.ref('oldPwd') 表示 newPwd 的值必须和 oldPwd 的值保持一致
    // 2. joi.not(joi.ref('oldPwd')) 表示 newPwd 的值不能等于 oldPwd 的值
    // 3. .concat() 用于合并 joi.not(joi.ref('oldPwd')) 和 password 这两条验证规则
    newPwd: joi.not(joi.ref('oldPwd')).concat(password),
  },
}

// 二 个人中心 2. 换头像base64
// dataUri() 指的是如下格式的字符串数据：
// 
const avatar = joi.string().dataUri().required()
// 验证规则对象 - 更新头像
exports.update_avatar_schema = {
  body: {
    avatar,  //avatar:avatar,可简写成avatar
  },
}


 //三 文章分类 函数2.  定义 分类名称 和 分类别名 的校验规则
const name = joi.string().required()
const alias = joi.string().alphanum().required()
// 校验规则对象 - 添加分类
exports.add_cate_schema = {
  body: {
    name,
    alias,
  },
} 


 //三 文章分类 3. 定义 分类Id 的校验规则
//const  id = joi.number().integer().min(1).required()    (上面1. 用户名验证已经写过了,这里就可以不写)
// 校验规则对象 - 删除分类
exports.delete_cate_schema = {
  params: {
    id,
  },
}


// 三 文章分类 4.校验规则对象 - 根据 Id 获取分类
exports.get_cate_schema = {
  params: {
    id,
  },
}


// 三 文章分类 5. 校验规则对象 - 更新分类
exports.update_cate_schema = {
  body: {
    Id: id,
    name,
    alias,
  },
}


// 四发布文章 1. 定义 标题、分类Id、内容、发布状态 的验证规则
const title = joi.string().required()
const cate_id = joi.number().integer().min(1).required()
const content = joi.string().required().allow('')
const state = joi.string().valid('已发布', '草稿').required()

// 验证规则对象 - 发布文章
exports.add_article_schema = {
  body: {
    title,
    cate_id,
    content,
    state,
  },
}

 